#pragma once

#include "oisinclude.h"

//extern
//bool appRunning;

//////////// Common Event handler class ////////
class OisEventHandler : 
	protected OIS::KeyListener, 
	protected OIS::MouseListener, 
	protected OIS::JoyStickListener
{
private:
	std::ostringstream oisInfo;

	InputSys* inputSys;

public:
	OisEventHandler(InputSys* const inputSys)
		: inputSys(inputSys)
	{}

	~OisEventHandler() {}

	//bool keyPressed( const OIS::KeyEvent &arg ) {
	//	
	//	oisInfo.str("");		 
	//	oisInfo << " KeyPressed {" << arg.key
	//		<< ", " << (((OIS::Keyboard*)(arg.device))->getAsString(arg.key))
	//		<< "} || Character (" << ((char)arg.text) << ")" ;
	//	
	//	_dbgout((oisInfo.str()+"\n").c_str());
	//		
	//	//signal
	//	String keyTex=((OIS::Keyboard*)(arg.device))->getAsString(arg.key);
	//	char charId=(char)arg.text;
	//	inputSys->signalKeyPressed(charId,keyTex);

	//	return true;
	//}
	//bool keyReleased( const OIS::KeyEvent &arg ) {		

	//	/*if( arg.key == OIS::KC_ESCAPE || arg.key == OIS::KC_Q )
	//	{
	//		appRunning = false;
	//	}*/
	//	
	//	oisInfo.str("");
	//	oisInfo << "KeyReleased {" << ((OIS::Keyboard*)(arg.device))->getAsString(arg.key) << "}\n";

	//	_dbgout((oisInfo.str()+"\n").c_str());

	//	//signal
	//	String keyTex=((OIS::Keyboard*)(arg.device))->getAsString(arg.key);
	//	char charId=(char)arg.text;
	//	inputSys->signalKeyReleased(charId,keyTex);

	//	return true;
	//}
//	bool mouseMoved( const OIS::MouseEvent &arg ) {
//		const OIS::MouseState& s = arg.state;
//		oisInfo.str("");
//		oisInfo << "\nMouseMoved: Abs("
//				  << s.X.abs << ", " << s.Y.abs << ", " << s.Z.abs << ") Rel("
//				  << s.X.rel << ", " << s.Y.rel << ", " << s.Z.rel << ")";
//		_dbgout((oisInfo.str()+"\n").c_str());
//
//		return true;
//	}
//	bool mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id ) {
//		const OIS::MouseState& s = arg.state;
//		oisInfo << "\nMouse button #" << id << " pressed. Abs("
//				  << s.X.abs << ", " << s.Y.abs << ", " << s.Z.abs << ") Rel("
//				  << s.X.rel << ", " << s.Y.rel << ", " << s.Z.rel << ")";
//		_dbgout((oisInfo.str()+"\n").c_str());
//		return true;
//	}
//	bool mouseReleased( const OIS::MouseEvent &arg, OIS::MouseButtonID id ) {
//		const OIS::MouseState& s = arg.state;
//		oisInfo.str("");
//		oisInfo << "\nMouse button #" << id << " released. Abs("
//				  << s.X.abs << ", " << s.Y.abs << ", " << s.Z.abs << ") Rel("
//				  << s.X.rel << ", " << s.Y.rel << ", " << s.Z.rel << ")";
//		_dbgout((oisInfo.str()+"\n").c_str());
//		return true;
//	}
//	bool buttonPressed( const OIS::JoyStickEvent &arg, int button ) {
//		oisInfo.str("");
//		oisInfo << std::endl << arg.device->vendor() << ". Button Pressed # " << button;
//		_dbgout((oisInfo.str()+"\n").c_str());
//		return true;
//	}
//	bool buttonReleased( const OIS::JoyStickEvent &arg, int button ) {
//		oisInfo.str("");
//		oisInfo << std::endl << arg.device->vendor() << ". Button Released # " << button;
//		_dbgout((oisInfo.str()+"\n").c_str());
//		return true;
//	}
//	bool axisMoved( const OIS::JoyStickEvent &arg, int axis )
//	{
//		//Provide a little dead zone
//		if( arg.state.mAxes[axis].abs > 2500 || arg.state.mAxes[axis].abs < -2500 )
//		{
//			oisInfo.str("");
//			oisInfo << std::endl << arg.device->vendor() << ". Axis # " << axis << " Value: " << arg.state.mAxes[axis].abs;
//			_dbgout((oisInfo.str()+"\n").c_str());
//		}
//		return true;
//	}
//	bool povMoved( const OIS::JoyStickEvent &arg, int pov )
//	{
//		oisInfo.str("");
//		oisInfo << std::endl << arg.device->vendor() << ". POV" << pov << " ";
//
//		if( arg.state.mPOV[pov].direction & OIS::Pov::North ) //Going up
//			oisInfo << "North";
//		else if( arg.state.mPOV[pov].direction & OIS::Pov::South ) //Going down
//			oisInfo << "South";
//
//		if( arg.state.mPOV[pov].direction & OIS::Pov::East ) //Going right
//			oisInfo << "East";
//		else if( arg.state.mPOV[pov].direction & OIS::Pov::West ) //Going left
//			oisInfo << "West";
//
//		if( arg.state.mPOV[pov].direction == OIS::Pov::Centered ) //stopped/centered out
//			oisInfo << "Centered";
//
//		_dbgout((oisInfo.str()+"\n").c_str());
//
//		return true;
//	}
//
//	bool vector3Moved( const OIS::JoyStickEvent &arg, int index)
//	{
//		oisInfo.str("");
//
//		oisInfo.precision(2);
//		oisInfo.flags(std::ios::fixed | std::ios::right);
//		oisInfo << std::endl << arg.device->vendor() << ". Orientation # " << index 
//			<< " X Value: " << arg.state.mVectors[index].x
//			<< " Y Value: " << arg.state.mVectors[index].y
//			<< " Z Value: " << arg.state.mVectors[index].z;
//		oisInfo.precision();
//		oisInfo.flags();
//
//		_dbgout((oisInfo.str()+"\n").c_str());
//		return true;
//	}
//};


////////////////////////////////////////////////////////